
/**
 * Deze klasse kan persoons gegevens opslaan en weergeven
 * 
 * @author (Wim Barelds, INV-1, Groep 4) 
 * @author (Sander Wagenaar, INV-1, Groep 4) 
 * @version (2)
 */
public class Persoon
{
    private String bsn;         // Burger service nummer
    private String voornaam;    // Voornaam
    private String achternaam;  // Achternaam
    private int jaar;           // Geboorte datum: Jaar
    private int maand;          // Geboorte datum: Maand
    private int dag;            // Geboorte datum: Dag
    private char geslacht;      // Geslacht
    private Dienblad dienblad;  // Dienblad van de persoon
    
    /**
     * Create a person class, enter:
     * BSN, Voornaam, Achternaam, Geboortedatum ( Jaar, Maand, Dag ), Geslacht (m/v)
     */
    
    /**
     * Constructor functie gebruikt door de Constructors
     */
    public Persoon()
    { constructor("", "", "", 0, 0, 0, ""); }
    
    /**
     * Constructor functie gebruikt door de Constructors
     */
    public Persoon(String bsn, String voornaam, String achternaam, int jaar, int maand, int dag, String geslacht)
    { constructor(bsn, voornaam, achternaam, jaar, maand, dag, geslacht); }
    
    /**
     * Constructor functie gebruikt door de Constructors
     */
    private void constructor(String bsn, String voornaam, String achternaam, int jaar, int maand, int dag, String geslacht)
    {
        setBsn(bsn);
        setVoornaam(voornaam);
        setAchternaam(achternaam);
        setGeboortedatum(jaar, maand, dag);
        setGeslacht(geslacht);
    }
    
    /**
     * Set BSN of person
     */
    public void setBsn(String bsn)
    {
        this.bsn = bsn;
    }
    
    /**
     * Set Voornaam of person
     */
    public void setVoornaam(String voornaam)
    {
        this.voornaam = voornaam;
    }
    
    /**
     * Set Achternaam of person
     */
    public void setAchternaam(String achternaam)
    {
        this.achternaam = achternaam;
    }
    
    /**
     * Checks if year is leap year
     * @param year to check
     * @return true/false
     */
    private boolean isLeapYear(int jaar)
    {
        if(jaar % 400 == 0 || (jaar % 4 == 0 && jaar % 100 > 0)) {
            return true;
        }
        else {
            return false;
        }
    }
    
    /**
     * Checks if date is valid
     * @param jaar maand en dag (datum)
     * @return true/false
     */
    private boolean isValidDate(int jaar, int maand, int dag)
    {
        // Voer eerst een basis check uit
        if(jaar < 1900 || jaar > 2100 || maand < 1 || maand > 12 || dag < 1 || dag > 31) {
            return false;
        }
        switch (maand) {
            case 2:
                // Voer een speciale check uit voor februari
                if(isLeapYear(jaar) && dag > 29) {
                    return false;
                }
                else if(!isLeapYear(jaar) && dag > 28) {
                    return false;
                }
            break;
            case 4:
            case 6:
            case 9:
            case 11:
                // Voer een check uit voor maanden met 30 dagen
                if(dag > 30) {
                    return false;
                }
            break;
        }
        // als we hier aankomen is het een valide datum
        return true;
    }
    
    /**
     * Set Geboortedatum (Jaar, Maand, Dag) of person
     */
    public void setGeboortedatum(int jaar, int maand, int dag)
    {
        // Controleer of het een geldige datum is, zo ja- sla die op. Zo nee, zet alle velden op 0
        if(isValidDate(jaar, maand, dag)) {
            this.jaar = jaar;
            this.maand = maand;
            this.dag = dag;
        }
        else {
            this.jaar = 0;
            this.maand = 0;
            this.dag = 0;
        }
    }
    
    /**
     * Set geslacht of person
     */
    public void setGeslacht(String geslacht)
    {
        if(geslacht.toLowerCase() == "m") {
            this.geslacht = 'm';
        }
        else if(geslacht == "v") {
            this.geslacht = 'v';
        }
        else {
            this.geslacht = '-';
        }
    }
    
    /**
     * Getter voor dienblad
     * @return dienblad
     */
    public Dienblad getDienblad()
    {
        return dienblad;
    }
    
    /**
     * Getter voor Burger service nummer
     * @return BSN
     */
    public String getBsn()
    {
        return bsn;
    }
    
    /**
     * Getter voor voornaam
     * @return voornaam
     */
    public String getVoornaam()
    {
        return voornaam;
    }
    
    /**
     * Getter voor achternaam
     * @return achternaam
     */
    public String getAchternaam()
    {
        return achternaam;
    }
    
    /**
     * Getter voor geboortedatum
     * @return Geboortedatum
     */
    public String getGeboortedatum()
    {
        String temp = "Onbekend";
        if(dag != 0 && maand != 0 && jaar != 0) {
            temp = dag+"/"+maand+"/"+jaar;
        }
        return temp;
    }
    
    /**
     * Getter voor geslacht
     * @return geslacht
     */
    public String getGeslacht()
    {
        String temp;
        switch(geslacht) {
            case 'm':
                temp = "Man";
            break;
            case 'v':
                temp = "Vrouw";
            break;
            default:
                temp = "Onbekend";
            break;
        }
        return temp;
    }
    /**
     * Methode om dienblad te koppelen aan een persoon
     * @param dienblad
     */
    public void pakDienblad(Dienblad dienblad)
    {
        this.dienblad = dienblad;
    }
    
    /**
     * Geef uitdraai van opgeslagen persoons gegevens
     */
    public void drukAf()
    {
        System.out.println("BSN:            "+getBsn());
        System.out.println("Naam:           "+getVoornaam()+" "+getAchternaam());
        System.out.println("Geboorte datum: "+getGeboortedatum());
        System.out.println("Geslacht:       "+getGeslacht());
    }
}
